package com.sz.biz.common.project.service.impl;

import com.sz.biz.common.constants.ErrorCodes;
import com.sz.biz.common.constants.ModuleNames;
import com.sz.biz.common.project.dto.TrdProjectKpiDto;
import com.sz.biz.common.project.entity.TrdProjectKpi;
import com.sz.biz.common.project.service.TrdProjectKpiService;
import com.sz.common.base.constants.UserActions;
import com.sz.common.base.dao.ParamData;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.common.base.dto.ResultDto;
import com.sz.common.base.exception.Exceptions;
import com.sz.common.base.service.AbstractService;
import com.sz.common.base.utils.EntityUtils;
import com.sz.common.base.utils.StringUtils;
import com.sz.common.core.service.PrincipalLogUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Function: TODO: ADD FUNCTION <br>
 * 贸易关键指标service实现类
 *
 * @author fengwj <br>
 * Date: 2017-12-11 15:41:00
 */
@Service("TrdProjectKpiService")
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class TrdProjectKpiServiceImpl extends AbstractService implements TrdProjectKpiService {

    /**
     * 验证参数方法调用参数，添加方法
     */
    private final static int ADD_TYPE = 0;
    /**
     * 验证参数方法调用参数，修改方法
     */
    private final static int UPDATE_TYPE = 1;

    @Override
    protected String getMapperNamespace() {
        return "com.sz.biz.common.project.entity.TrdProjectKpiMapper";
    }

    /**
     * 验证参数是否合法
     *
     * @param trdProjectKpiDto trdProjectKpiDto
     * @param type             调用方法类型
     * @author Fengwj
     * @date 17:37 2017/12/11
     */
    private void checkMainDataValid(TrdProjectKpiDto trdProjectKpiDto, int type) {
        if (null == trdProjectKpiDto) {
            throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "trdProjectKpi");
        }

        //新建方法只验证项目名称，保存方法验证对象id及项目名称
        if (type == 0) {
            if (StringUtils.isEmpty(trdProjectKpiDto.getProjectName())) {
                throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "projectName");
            }
        } else {
            if (StringUtils.isEmpty(trdProjectKpiDto.getId()) || trdProjectKpiDto.getId() == 0) {
                throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "id");
            }
            if (StringUtils.isEmpty(trdProjectKpiDto.getProjectName())) {
                throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "projectName");
            }
        }

    }

    /**
     * 保存
     *
     * @param trdProjectKpiDto trdProjectKpiDto
     * @return 保存是否成功
     * @author Fengwj
     * @date 17:06 2017/12/11
     */
    @Override
    public Integer save(TrdProjectKpiDto trdProjectKpiDto) {
        //验证参数是否合法
        if (null == trdProjectKpiDto) {
            throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "trdProjectKpiDto");
        }
        checkMainDataValid(trdProjectKpiDto, ADD_TYPE);

        //数据转换，从dto转换到entity
        TrdProjectKpi trdProjectKpi = new TrdProjectKpi();
        EntityUtils.copyPropertiesIgnoreNull(trdProjectKpiDto, trdProjectKpi);

        //保存新建数据
        dao.save(getSqlName("insert"), trdProjectKpi);

        //日志操作
        Map<String, Object> dataBackup = new HashMap<>(1);
        dataBackup.put("ADD_CONT_TEMPLATE", trdProjectKpi);
        PrincipalLogUtils.addOperationLog(ModuleNames.TRD, ModuleNames.TRD_PROJECT_KPI, UserActions.ADD, "新增贸易关键指标", dataBackup);
        //返回保存成功数据id
        return trdProjectKpi.getId();
    }

    /**
     * 修改
     *
     * @param trdProjectKpiDto trdProjectKpiDto
     * @return 修改是否成功
     * @author Fengwj
     * @date 17:07 2017/12/11
     */
    @Override
    public Integer update(TrdProjectKpiDto trdProjectKpiDto) {
        //验证参数是否合法
        if (null == trdProjectKpiDto) {
            throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "trdProjectKpiDto");
        }
        checkMainDataValid(trdProjectKpiDto, UPDATE_TYPE);

        //数据转换，从dto转换到entity
        TrdProjectKpi trdProjectKpi = new TrdProjectKpi();
        EntityUtils.copyPropertiesIgnoreNull(trdProjectKpiDto, trdProjectKpi);
        //修改数据
        dao.update(getSqlName("updateById"), trdProjectKpi);

        //日志操作
        Map<String, Object> dataBackup = new HashMap<>(1);
        dataBackup.put("ADD_CONT_TEMPLATE", trdProjectKpi);
        PrincipalLogUtils.addOperationLog(ModuleNames.TRD, ModuleNames.TRD_PROJECT_KPI, UserActions.UPDATE, "修改贸易关键指标", dataBackup);
        //返回保存成功数据id
        return trdProjectKpi.getId();
    }

    /**
     * 批量保存
     *
     * @param trdProjectKpis trdProjectKpis
     * @return 新增是否成功
     * @author Fengwj
     * @date 16:54 2017/12/11
     */
    @Override
    public Integer batchSave(List<TrdProjectKpi> trdProjectKpis) {
        return   dao.batchInsert(getSqlName("insert"), trdProjectKpis);
    }

    /**
     * 保存
     *
     * @param trdProjectKpi trdProjectKpi
     * @return 新增是否成功
     * @author Fengwj
     * @date 16:54 2017/12/11
     */
    @Override
    public Integer insert(TrdProjectKpi trdProjectKpi) {
        return dao.save(getSqlName("insert"), trdProjectKpi);
    }

    /**
     * 按id查询
     *
     * @param id id
     * @author Fengwj
     * @date 17:08 2017/12/11
     */
    @Override
    public TrdProjectKpi findById(Integer id) {
        //验证参数是否合法
        if (null == id || id == 0) {
            throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "id");
        }

        //查询结果并返回
        return (TrdProjectKpi) dao.findForObject(getSqlName("selectById"), id);
    }

    /**
     * 按id删除
     *
     * @param id id
     * @author Fengwj
     * @date 17:09 2017/12/11
     */
    @Override
    public void deleteById(Integer id) {
        //验证参数是否合法
        if (null == id || id == 0) {
            throw Exceptions.bizException(ErrorCodes.ERROR_ARGUMENT_EMPTY, "id");
        }

        //删除数据未找到抛出异常
        TrdProjectKpi trdProjectKpi = findById(id);
        if (null == trdProjectKpi) {
            throw Exceptions.bizException(ErrorCodes.ERROR_MODEL_NOT_FOUND, id);
        }
        //保存假删数据
        dao.update(getSqlName("deleteById"), id);
        //日志操作
        Map<String, Object> dataBackup = new HashMap<>(1);
        dataBackup.put("ADD_CONT_TEMPLATE", trdProjectKpi);
        PrincipalLogUtils.addOperationLog(ModuleNames.TRD, ModuleNames.TRD_PROJECT_KPI, UserActions.ADD, "删除贸易关键指标", dataBackup);
    }

    /**
     * 按时间倒序查询所有指标列表
     *
     * @param queryParams 分页参数
     * @return QResultDto 查询结果列表
     * @author Fengwj
     * @date 14:46 2017/12/12
     */
    @Override
    public QResultDto getTrdProjectkpiList(QueryParams queryParams) {
        ParamData pd = this.convertQueryParams(queryParams);
        List<TrdProjectKpi> trdProjectKpiList = dao.findForList(getSqlName("selectAllListPage"), pd, TrdProjectKpi.class);
        QResultDto qResultDto = new QResultDto(trdProjectKpiList, pd.getPagination());

        return qResultDto;
    }

    /**
     * 按时间倒序查询最新的3个指标列表
     *
     * @return QResultDto 查询结果列表
     * @author Fengwj
     * @date 18:04 2017/12/12
     */
    @Override
    public ResultDto getNewestList() {
        List<TrdProjectKpi> trdProjectKpiList = dao.findForList(getSqlName("selectNewestList"), TrdProjectKpi.class);
        ResultDto resultDto = new ResultDto();
        resultDto.setData(trdProjectKpiList);
        return resultDto;
    }

    /**
     * 根据主键id集合假删除数据
     *
     * @param ids 主键id集合
     * @author Fengwj
     * @date 16:28 2017/12/13
     */
    @Override
    public void batchDelete(List<Integer> ids) {
        dao.update(getSqlName("deletedByIds"), ids);
    }
}
